#pragma once
#include"Sem.hpp"
#include<vector>
#include"Mutex.hpp"


#define value 5
template<class T>
class RunQueue
{
    public:
    RunQueue(const int& cap=value)
    :_cap(cap)
    ,_rq(cap)
    ,_blank_sem(cap)
    ,_date_sem(0)
    ,p_step(0)
    ,c_step(0)
    {}

    ~RunQueue()
    {
    }
    //入队列：
    void Equeue(const T& in)
    {
        //生产者：
        LockGuard lockguard(_p_mutex);
        sleep(1);
        _blank_sem.P();//空位置--
        _rq[p_step]=in;
        p_step++;
        p_step%=_cap;
        _date_sem.V();//数据++
    }
    //出队列：
    void Pop(T* out)
    {
        LockGuard lockguard(_c_mutex);
        _date_sem.P();
        *out=_rq[c_step];
        c_step++;
        c_step%=_cap;
        _blank_sem.V();
    }
    private:
    std::vector<T> _rq;
    int _cap;//容量
    //生产者：
    Sem _blank_sem;
    int p_step;
    Mutex _p_mutex;
    //消费者：
    Sem _date_sem;
    int c_step;
    Mutex _c_mutex;
};